
/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    s3c2440_uda1341.c
 * @brief   ASOC框架下的machine部分，在s3c2440芯片上对uda1341编解码芯片的
 *          操作（构建了一个平台设备），参考sound\soc\samsung\s3c24xx_uda134x.c。
 *
 * @note    1、分配注册一个名为soc-audio的平台设备
 *          2、平台设备有一个私有数据—snd_soc_card，其中的.dai_link为核心。
 *             .dai_link被用来决定ASOC各部分的驱动
 * @author  K
 * @version 0.0.1
 * @date    2021-08-07
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-08-07   | v0.0.1    | Kcode   | s3c2440芯片对uda1341的硬件初始化操作
 * -----------------------------------------------------------------------------
 ******************************************************************************/

#include <linux/clk.h>
#include <linux/gpio.h>
#include <linux/module.h>
#include <sound/soc.h>

static struct snd_soc_ops s3c2440_uda1341_ops = {
    //.hw_params = s3c2440_uda1341_hw_params, /**< s3c2440对uda1341的硬件设置 */
};

/*!
 * 根据snd_soc_dai_link结构中指定正确codec、 platform和dai
 */
static struct snd_soc_dai_link s3c2440_uda1341_dai_link = {
	.name           = "100ask_uda1341",
	.stream_name    = "100ask_uda1341",
	.codec_name     = "uda1341-codec",  /**< 根据名字把对应的编解码芯片联系起来 */
	.codec_dai_name = "uda1341-iis",    /**< 根据名字把对应的编解码芯片的dai联系起来 */
	.cpu_dai_name   = "s3c2440-iis",    /**< 根据名字把对应的控制芯片dai联系起来 */
	.ops            = &s3c2440_uda1341_ops,
	.platform_name	= "s3c2440-dma",    /**< 根据名字把对应的platform联系起来 */
};

static struct snd_soc_card myalsa_card = {
	.name = "S3C2440_UDA1341",
	.owner = THIS_MODULE,
	.dai_link = &s3c2440_uda1341_dai_link,
	.num_links = 1,    
};

/*!
 * @brief 关闭设备函数，必须得有，否则程序编译报错
 * @return void
 */
static void asoc_release(struct device *dev)
{}

/*!
 * 分配注册一个名为soc-audio的平台设备
 */
static struct platform_device asoc_dev = {
    .name = "soc-audio",
    .id   = -1,
    .dev  = {
        .release = asoc_release,
    },
};

/*!
 * @brief 入口函数
 * @return int 0：注册成功，1：注册失败
 */
static int s3c2440_uda1341_init(void)
{
    int ret = 0;
    
    /* 把snd_soc_card设置到platform_device中 */
    platform_set_drvdata(&asoc_dev, &myalsa_card);

    /* 注册平台设备 */
    ret = platform_device_register(&asoc_dev);
    if (ret)
        printk("Can not register platform asoc_dev!\n");
        
    return ret;
}

/*!
 * @brief 出口函数
 * @return int，
 */
static void s3c2440_uda1341_exit(void)
{
    platform_device_unregister(&asoc_dev);
}

/* 修饰 */
module_init(s3c2440_uda1341_init);
module_exit(s3c2440_uda1341_exit);

/* 协议 */
MODULE_LICENSE("GPL");


